a) Skriv to udgaver af programmet som laver matrix multiplikation på en 400x400 matrice. Kompiler dem med

udgave1

#include <stdio.h>
#include <string.h>
 
#define NUM 600
 
 
int main(void)
{
  double A[NUM][NUM];
  double B[NUM][NUM];
  double C[NUM][NUM];
 
 
    int i,j,k;
    int N = NUM;
 
    for (i=0; i<N; i++) {
        for (j=0; j<N; j++) {
            for (k=0; k<N; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
 
    }
    return C[N-1][N-1];
 
}



udgave2
#include <stdio.h>
#include <string.h>
 
#define NUM 400
 
double A[NUM][NUM];
double B[NUM][NUM];
double C[NUM][NUM];
 
int main(void)
{
  int i,j,k;
  int N = NUM;
 
  double tmp[N][N];
 
  for (i = 0; i < N; ++i)
    for (j = 0; j < N; ++j)
      tmp[i][j] = B[j][i];
  for (i = 0; i < N; ++i)
    for (j = 0; j < N; ++j)
      for (k = 0; k < N; ++k)
    C[i][j] += A[i][k] * B[j][k];
 
  return C[N-1][N-1];
 
}




b) Mål tidsforbruget for udførslen af matrix multiplikationen


stud@GoldenImage:~/MPS/Opgave10$ time ./matrix



real 0m1.875s

user 0m0.620s

sys 0m1.232s



c) Kør programmerne med Cachegrind og noter den procentuelle cache-miss:
==4171== D1  miss rate:           1.4% (        1.6%     +        0.0%  )
==4171== LLd miss rate:           0.8% (        0.8%     +        0.0%  )


d) Fortsæt dataopsamlingen med de forskellige optimiserings parametre (Hvad gør de forskellige optimeringer??) Sammenlign resultaterne, er der forskel i performance? Hvad virker bedst og hvorfor?

1. optimering

==4295== D1  miss rate:        11.2% (       11.1%     +    21.0%  )
==4295== LLd miss rate:         6.2% (        6.2%     +     0.0%  )

2.optimering
==4224== D1  miss rate:        11.1% (       11.0%     +    40.2%  )
==4224== LLd miss rate:         6.2% (        6.2%     +     0.0%  )

3.optimering

==4212== D1  miss rate:        11.1% (       11.0%     +    40.2%  )
==4212== LLd miss rate:         6.2% (        6.2%     +     0.0%


e) Kompiler programmet til target (arm-none-linux-gnueabi-gcc) og eksekvér det herpå med time.


der opstår en segmentation fault. da stackens størelse på 8192kB bliver overskredet nedenfor kan se ses udskriften.
Segmentation fault
 
real    0m20.953s
user    0m20.854s
sys     0m0.076s